package auth

import (
	"fmt"
	"gitee.com/RocsSun/webhook/config"
	"net/url"
)

const (
	GiteeBaseUri    = "https://gitee.com/"
	GiteeOAuthorize = "oauth/authorize"
	GiteeToken      = "oauth/token"
)

type GiteeOAuth struct {
	clientID     string
	callBack     string
	clientSecret string
	Token        Token
}

var gitee *GiteeOAuth

// NewGiteeOAuth 实例化。
func NewGiteeOAuth() *GiteeOAuth {
	if gitee != nil {
		fmt.Println(gitee.callBack)
		return gitee
	}

	gitee = &GiteeOAuth{
		clientID:     config.ConInst.ClientID,
		clientSecret: config.ConInst.ClientSecret,
		callBack:     "http://127.0.0.1:8080/auth/callback",
	}
	fmt.Println(gitee.callBack)
	return gitee
}

// CallAuth 生成获取授权的URL。
func (g *GiteeOAuth) CallAuth() string {
	u, err := url.Parse(GiteeBaseUri + GiteeOAuthorize)
	if err != nil {
		return ""
	}
	query := u.Query()
	query.Add("client_id", g.clientID)
	query.Add("redirect_uri", g.callBack)
	query.Add("response_type", "code")
	fmt.Println(query.Encode())
	u.RawQuery = query.Encode()
	return u.String()
}

// Callback 回调函数。
func (g *GiteeOAuth) Callback(code string) (Token, error) {
	return CallBack(GiteeBaseUri+GiteeToken, g.clientID, g.clientSecret, code, g.callBack, "authorization_code")
}

// RefreshToken 重新获取token。
func (g *GiteeOAuth) RefreshToken() (Token, error) {
	return RefreshToken(GiteeBaseUri+GiteeToken, g.Token.RefreshToken)
}
